# -*- coding: utf-8 -*-
"""
@Auth:
@Time: 2022-11-04 10:35
"""
# 应用的主函数部分
import os

import pandas as pd

import pretreatment
import common

import warnings  # 警告信息函数

warnings.filterwarnings("ignore")  # 忽略版本不同打印的警告信息


def read_all_data():
    """
    分块读取overAll.csv的数据，并合并为一个数据集
    :return: pd.DataFrame 数据集
    """
    over_all = pd.read_csv(common.MERGE_DATA_PATH, chunksize=1000, encoding="utf-8")
    all_data = pd.DataFrame()
    for item in over_all:
        all_data = pd.concat([all_data, item])
    return all_data


def get_2020_data(data_frame: pd.DataFrame):
    """
    获得2020年的数据集
    :param data_frame: 总数据集
    :return: 2020年的数据集
    """
    # 对日期进行聚类
    data_frame["事故日期"] = pd.to_datetime(data_frame["事故日期"], errors='coerce')
    data_frame = data_frame.groupby(data_frame["事故日期"].dt.year)
    data_2020 = None
    for item in data_frame:
        if item[0] == 2020:
            # 获取到2020年的数据集
            data_2020 = item[1]
            break
    return data_2020


def group_analysis(data_frame: pd.DataFrame):
    """
    聚类分析车辆出险数量
    :param: data_frame 数据集
    :return:
    """
    # 获得2020年的数据集
    data_2020 = get_2020_data(data_frame)

    # 对车辆出险的公司进行聚类
    data_2020 = data_2020.groupby(data_2020["投保公司完整名称"])
    company = []
    amount = []
    for item in data_2020:
        # 车辆出险数量统计
        company.append([item[0], len(item[1])])
        # 理赔金额统计
        amount.append([item[0], item[1]["理赔金额"].sum()])

    if not os.path.exists(common.CARS_SORT_PATH):
        data_company = pd.DataFrame(columns=["投保公司完整名称", "2020年车辆出险数量"], data=company)
        # 降序
        data_company = data_company.sort_values(by="2020年车辆出险数量", ascending=False)
        # 存入降序排列的结果
        data_company.to_csv(common.CARS_SORT_PATH, encoding="utf-8", index=False)
        data_company = data_company.iloc[:5, :]
        # 存入前五的公司名称
        data_company.to_csv(common.COMPANY_TOP5_PATH, encoding="utf-8", index=False)

    # 2020年出险后获赔金额最多的5家企业（或个人）的企业完整名称及对应理赔金额。
    if not os.path.exists(common.AMOUNT_TOP5_PATH):
        data_amount = pd.DataFrame(columns=["投保公司完整名称", "2020年总理赔金额"], data=amount)
        # 降序
        data_amount = data_amount.sort_values(by="2020年总理赔金额", ascending=False)
        data_amount = data_amount.iloc[:5, :]
        # 数据存储
        data_amount.to_csv(common.AMOUNT_TOP5_PATH, encoding="utf-8", index=False)


if __name__ == '__main__':
    data = read_all_data()
    data = pretreatment.do(data)
    # 聚类分析车辆出险数量
    group_analysis(data)

